package com.tedu.API.list;
/**
 * 10.09知识整理:
 *             集合
 *       泛型:常用jdk1.7
 *          |
 *   Iterator迭代器:问、取、删
 *         |                                         常用
 *  Collection顶级集合接口: 方法                         |
 *                         |                   ArrayList重写List所有方法
 *                    List集合接口:有序、重复值---LinkedList---学习独有方法
 *                                 |           Vector[不学]
 *                                 方法使用【与ArrayList有重合部分】
 */

import org.junit.Test;
/**
 * 导入包问题:同一包下的类需要导入
 *          import java.util.ArrayList;
 *          import java.util.List;
 * 通配符   *   匹配当前包【文件夹】下所有的类
 *           import java.util.*;
 */
import java.util.*;

/**
 * List集合
 * Collection顶级集合接口【容器】-----List集合【子接口】
 * List集合存储数据: 存储有序并且重复的元素
 * List集合---接口---无法创建对象
 * 实现类:
 * ArrayList: 【常用: List与ArrayList的方法完全一致】数组实现
 * LinkedList: 双向链接实现
 * Vector: jdk1.0版本: 性能：增删效率慢，线程安全! --ArrayList
 *
 * 重点:掌握List集合中所有方法
 */
public class ListAPI {
    /**
     * get(int index)     返回值:E ----理解为Object
     * 作用:获取给定下标处的元素，从0开始
     */
    @Test
    public void testGet(){
        //List集合----多态创建集合
        List<String> list=new ArrayList<>();
        //Collection   提供add方法 |  List  提供add方法  【重写】
        list.add("三生三世十里桃花");
        list.add("你的名字");
        list.add("抓娃娃");
        System.out.println("List集合: "+list);
        //获取到: List集合中元素叫:  你的名字
        String str=list.get(1);
        System.out.println("获取集合中: "+str);
        //获取到List集合中所有的元素----普通for
        for (int i=0;i< list.size();i++){  //针对集合----下标: 从0开始
            str=list.get(i);
            System.out.println("遍历List集合: "+str);
        }

    }
    /**
     * set(int index, E e)   返回值:E
     * 作用:将给定元素设置到指定的下标位置处
     */
    @Test
    public void testSet(){
        List<String> list=new ArrayList<>();
        //Collection   提供add方法 |  List  提供add方法  【重写】
        list.add("三生三世十里桃花");
        list.add("你的名字");
        list.add("抓娃娃");
        //需求: List集合中元素"你的名字"修改为"749局"
        list.set(1,"749局");
        System.out.println("修改后的list集合: "+list);
    }

    /**
     * List继承Collection[重载: 拓展功能  方法名相同，参数不同]
     * add(int index,E e)
     * 作用: 将给定元素插入指定位置【在指定的位置前面插入】
     * remove(int index)    返回值: E
     * 作用: 将给定位置的元素从集合中删除
     *
     * 特点: 查询快，增删慢---选择List/ArrayList
     */
    @Test
    public void testAR(){
        //创建List集合---重写add()方法   重载方法add(下标，"元素")
        List<String> list=new ArrayList<>();
        list.add("胡歌");list.add("楚逸");
        list.add("福公");list.add("玉相遥");
        System.out.println("List集合元素: "+list);
        list.add(2,"阿雪");
        System.out.println("List集合元素: "+list);
        list.remove(3);
        System.out.println("List集合元素: "+list);
    }

    /**
     * List集合:
     * subList(int start,int end)   返回值: List<E>
     * 作用: 截取范围内子集   口诀: 含头不含尾
     */
    @Test
    public void testSubList(){
        //创建集合，10个元素:0~9
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<10;i++){   //i  循环针对下标
            list.add(i);
        }
        System.out.println("List集合: "+list);
        //获取子集： list集合元素中3~8之间元素
        List<Integer> listch=list.subList(3,9);
        System.out.println("获取子集: "+listch);
        System.out.println("List集合: "+list);
        //获取子集： list集合元素中2~6之间元素,子集元素扩大十倍
        //1.从list集合中，取2~6之前元素
        List<Integer> lch=list.subList(2,7);
        //2.for循环遍历子集，遍历同时给每个下标的元素*10
        for (int i=0;i< lch.size();i++){  //i获取下标  0~4
            lch.set(i,lch.get(i)*10);
        }
        System.out.println("子集扩大十倍元素: "+lch);
        //提示: size()   获取子集长度  set(下标，获取元素*10) 设置每个下标元素
        //     get(下标) 获取元素*10
        /**
         *   需求：清空  lch子集   输出list集合   【0,1,7,8,9】
         *   特点: 清空clear以及设置set直接对集合做操作
         */
        System.out.println("【list】"+list);
        lch.clear();
        System.out.println("清空子集,输出list集合: "+list);
    }

    /**
     * 集合排序:
     * Random   伪随机数类    包位置: java.util
     * nextInt(数值)   返回值一个伪随机整数【范围: 0~数值】
     *
     * Collections  集合工具类  静态方法sort
     * sort()方法: 针对集合元素是数值进行排序【默认：升序】  返回值:List
     * 需求: 随机生成十个元素【整数:100以内】的集合---对集合排序
     */
    /**
     * Collection和Collections的区别:
     *       Collection集合顶级接口，规定所有集合方法
     *       Collections集合的工具类，规定集合的操作方法
     */
    @Test
    public void testArrayList(){
        //创建List集合<整数>
        List<Integer> list=new ArrayList<>();
        //创建伪随机数
        Random r=new Random();
        for (int i=0;i<10;i++){  //10个元素
            list.add(r.nextInt(100));  //100以内的随机数
        }
        System.out.println("打印List: "+list);
        //对list集合元素进行排序  Collections.sort(集合)
        Collections.sort(list);
        System.out.println("【有排序】 打印List: "+list);
    }

    /**
     * 需求: 创建集合，存汉字，排序---能排序【没规则】
     * sort(集合，Comparator比较器)    重载功能: 拓展排序的功能
     * 集合: 排序集合
     * Comparator比较器接口: 制定规则---【定规则: 按照字符串长短进行排序】
     * 重写: compare()方法---定义比较规则，默认自带交换功能
     */
    @Test
    public void testComparator(){
        //创建List集合--存: 汉字
        List<String> list=new ArrayList<>();
        list.add("雪霁羹");  //3
        list.add("扬州炒饭");
        list.add("鹄羹");

        //比较器接口规则定义: 按照字符串长短进行排序
        //comparator比较器接口--创建一次对象---采用匿名内部类
        Comparator<String> comparator=new Comparator<String>(){
            //comparator方法: 针对集合【自定义】排序
            //参数: 泛型: Object o1  集合中假设的第一个【交换】元素
            //参数: 泛型: Object o2  集合中假设的第二个【交换】元素
            @Override
            public int compare(String o1, String o2) {
                /**
                 * 返回值  大于 0   4-2   交换
                 * 返回值  小于 0   3-4  不交换
                 * 返回值  等于 0    2-2  不变
                 */
                return o1.length()-o2.length();
            }
        };


        Collections.sort(list);
        System.out.println("排序后集合: "+list);
    }
}


//学习心得: 练---拓展【计算机语言】---坚持【45%】
//JavaSE基础    JavaEE
